package com.netty.demo.server.netty.protocol;

import com.netty.demo.server.netty.constant.ConstantValue;
import io.netty.channel.socket.DatagramPacket;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.net.InetSocketAddress;

/**
 * 客户端请求服务端的对象
 * 数据包格式
 * +——----——+——-----——+——----——+——----——+——-----——+
 * 帧头：uint32 4字节   源逻辑id：uint32 4字节    目标逻辑id：uint32 4字节   消息长度：uint32  4字节    消息类型：uint8 1字节  消息id：uint8  1字节  消息体 字符    帧尾：uint32 4字节
 * +——----——+——-----——+——----——+——----——+——-----——+
 * 协议开始标志 HEAD，为int类型的数据，16进制表示为0X110
 * 传输数据的长度  length int类型
 * java 数据类型对应字节
 * byte     1字节
 * short    2字节
 * int      4字节
 * long     8字节
 * char     2字节
 * float    4字节
 * double   8字节
 * boolean  false/true (理论上占用1bit,1/8字节，实际处理按1byte处理)
 * ByteBuf  的read 操作是会改变索引
 * 读取和规定格式不一样,会读串数据.
 * 按照规定的数据协议读取数据 如果在规定的协议中，有大端字节和小端字节的问题
 * 把  in.readShort() 改为 readShortLE()
 * Byte   Long  读取方式同上   改为带LE的方法即可
 *
 * @author 余秀良
 * @version 1.0
 * <p>date: 2019年09月09日  14:39 </p>
 * <p>address: 四川成都 </p>
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class RequestProtocol {
    /**
     * 帧头
     */
    private long packageHead = ConstantValue.PACKAGE_HEAD;
    /**
     * 帧尾
     */
    private long packageEnd = ConstantValue.PACKAGE_END;
    /**
     * 协议头(主题标识)
     */
    private String protocolHeader;
    /**
     * 源逻辑id
     */
    private long sourceLogicId;
    /**
     * 目标逻辑id
     */
    private long targetLogicId;
    /**
     * 长度
     */
    private long length;
    /**
     * 消息类型
     */
    private short messageType;
    /**
     * 消息id
     */
    private short messageId;
    /**
     * 数据部分
     */
    private String data;
    /**
     * 来源地址（消息发送者）  用于回消息用
     */
    private InetSocketAddress sourceAddress;
    /**
     * 消息接收者(当前接收消息的netty服务)
     */
    private DatagramPacket recipient;
}
